package euler.p001_050;

import euler.MainEuler;

public class Euler012 extends MainEuler {
    /*
        The sequence of triangle numbers is generated
        by adding the natural numbers.
        So the 7th triangle number would be
        1 + 2 + 3 + 4 + 5 + 6 + 7 = 28.

        The first ten terms would be:
        1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...

        Let us list the factors of the first seven
        triangle numbers:

             1: 1
             3: 1,3
             6: 1,2,3,6
            10: 1,2,5,10
            15: 1,3,5,15
            21: 1,3,7,21
            28: 1,2,4,7,14,28

        We can see that 28 is the first triangle
        number to have over five divisors.

        What is the value of the first triangle number
        to have over five hundred divisors?
     */
    public String resolve(int limite) {
        for (int i = 2; i < Integer.MAX_VALUE; i++) {
            int d;
            if (i % 2 == 0) {
                d = divisoresDeLaMitad(i)*primeHelper.cantidadDivisores(i+1);
            } else {
                d = divisoresDeLaMitad(i+1)*primeHelper.cantidadDivisores(i);
            }

            if (d > limite) {
                return String.valueOf(i*(i+1)/2);
            }
        }

        return null;
    }

    private int divisoresDeLaMitad(int n) {
        n/=2;

        int div_2n = n;
        int d = 1;
        int e = 0;

        while (div_2n % 2 == 0) {
            div_2n/=2;
            d*=2;
            e++;
        }

        return primeHelper.cantidadDivisores(n / d)*(e + 1);
    }

}
